import { _decorator, Component, Node, instantiate, Vec3 } from 'cc';
import { Utils } from '../Data/Utils';
const { ccclass, property } = _decorator;

/********  战斗管理器，用于创建和管理敌人，输赢的判断等等   **********/

@ccclass('BattleManager')
export class BattleManager extends Component {
    @property({
        type:[Node],
        displayOrder:1
    })
    //包含所有敌人预物体的数组.
    enemyPrefabArray:Node[] = [];

    @property({
        type:Node,
        displayOrder:2
    })
    //所有复制出来的敌人的父亲.
    enemyParent:Node = null;

    //怪物出生的范围.
    private _xMin = -15;
    private _xMax = 15;
    private _zMin = -45;
    private _zMax = -35;

    //战斗中，同屏存在的最大的敌人数量.
    private _maxEnemyNum = 15;
    //复制敌人的间隔.
    private _enemyCreateInterval = 0.2;
    //所有复制的敌人，都保存在此数组中.
    private _allEnemies:Node[] = [];

    start(){
        //复制敌人到上限.
        this._createEnemies();
    }

    //复制敌人，敌人数量不可超过上限，复制敌人有间隔.
    private _createEnemies(){
        if(this._allEnemies && this._allEnemies.length>=this._maxEnemyNum){
            //如果敌人数组不为空，并且长度超过上限，则无需再额外复制敌人，可以退出.
            return;
        }

        //复制一个敌人.
        this._createASigleEnemy();
        //复制敌人的时间间隔之后，再复制下一个敌人.
        this.scheduleOnce(this._createEnemies.bind(this),this._enemyCreateInterval);
    }

    //此函数用于复制一个敌人.
    private _createASigleEnemy(){
        //所有怪物都同几率被复制,先取出数组中一个随机元素的下标.
        const randomIndex = Math.floor(Math.random()*this.enemyPrefabArray.length);
        //根据下标，取出要被复制的随机的怪物的预物体.
        const enemyPrefab = this.enemyPrefabArray[randomIndex];
        //复制敌人.
        let enemy = instantiate(enemyPrefab);
        //将该节点激活.
        enemy.active = true;
        //将复制出来的敌人加入数组中.
        this._allEnemies.push(enemy);
        enemy.setParent(this.enemyParent);

        //敌人的出生点:x坐标在-15,15之间，z坐标在-35,-45之间.
        const randomBornPoint = this._getRandomBornPoint();
        enemy.setPosition(randomBornPoint);
        console.warn('复制一个敌人，坐标是:'+randomBornPoint);
    }

    //根据边界值，生成一个随机的出生坐标.
    private _getRandomBornPoint(){
        //根据最小值和最大值，求一个二者之间的随机值.
        const randomX = Utils.getRandomNumber(this._xMin,this._xMax);
        const randomZ = Utils.getRandomNumber(this._zMin,this._zMax);
        return new Vec3(randomX,0,randomZ);
    }
}
